package io流;

import io流.person.Person;
import org.junit.Test;

import java.io.*;

/**
 * IO流--穿对象--高级流
 * ObjectOutputStream对象输出流--穿person.java--写 操作
 * ObjectInputStream   对象输入流---穿Person.java--读操作
 */

public class Object {
    /**
     * ObjectOutputStream对象输出流  序列化
     * 使用方式：1.创建实现序列化接口对象
     *         2.对象输出流  person.obj文件  写出
     *                     指定格式写出
     */
    @Test
    public   void  testOOS(){
        //创建person对象
        Person  p=new Person();
        p.setName("叮咚鸡");
        p.setSay(new String[]{"大狗打勾叫叫叫"});//动态数组
        System.out.println("打印对象"+p);

        //对象输出写出文件  xxx.obj
        FileOutputStream  c=null;
        ObjectOutputStream c2=null;
        /**
         * writeObject(Object  obj);--理解：写出对象
         * 该方法会将给定对象按照其结构进行转换
         * 转为为一组”字节“，再通过其处理的流写出
         *
         * 写出文件的专业术语：
         * 1.通过对象输出流将Person类，先转换为一组”字节“，这个过程【对象序列化】
         * 2.系那个序列化后的字节再通过字节流【低级流】写入文件中
         * 【硬盘上】做长久保存，这个过程【数据持久化】
         */
        try{
            c=new FileOutputStream("person.obj");
            c2=new ObjectOutputStream(c);
            c2.writeObject(p);
        }
        catch(FileNotFoundException e){
            e.printStackTrace();
        }
        catch (IOException e){
            e.printStackTrace();
        }
        finally {
            if (c2!=null)
                try{
                    c2.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
        }
        System.out.println("");
    }
    /**
     * ObjectInputStream  对象输入流
     * 序列化：将对象转换为二进制
     * 反序列化：二进制转换为对象
     * readObject()  返回读取的对象【?】
     * 需求：将序列化person.obj文件  按照对象方式读入
     */
   /*@Test
    public   void testOIS() throws IOException, ClassNotFoundException {
        //创建低级流
        FileInputStream fis=new FileInputStream("person.obj");
        //创建高级流--对象流入
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject() 获取对象【反序列化操作；二进制转换为对象】
        System.out.println(ois.readObject());
        System.out.println("反序列化成功");
    }*/
    @Test
    public  void testOIS2(){
        //创建低级流
        FileInputStream fis=null;
        ObjectInputStream ois=null;
        try{
            fis=new FileInputStream("person.obj");
            //创建高级流
            ois=new ObjectInputStream(fis);
            //readObject() 获取对象【反序列化操作：二进制转换为对象】
            System.out.println(ois.readObject());
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }finally {
            if (ois!=null)
                try{
                    ois.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
        }
        System.out.println("反序列化成功");
    }
}
